import axios from 'axios'
import { useUserStore } from '../stores/user'
import { toast } from './toast'

// 创建 axios 实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || 'http://47.109.65.209:8080',
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 从 Pinia store 获取 token
    const userStore = useUserStore()
    const token = userStore.token

    // 如果存在 token，则添加到请求头
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }

    // 打印请求信息（开发环境）
    if (import.meta.env.DEV) {
      console.log('🚀 Request:', config.method?.toUpperCase(), config.url)
      if (config.data) {
        console.log('📤 Request Data:', config.data)
      }
      if (config.params) {
        console.log('🔍 Request Params:', config.params)
      }
    }

    return config
  },
  error => {
    console.error('❌ Request Error:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 打印响应信息（开发环境）
    if (import.meta.env.DEV) {
      console.log('✅ Response:', response.config.url, response.status)
      console.log('📥 Response Data:', response.data)
    }

    const { data, code, message } = response.data

    // 根据后端返回的状态码进行处理
    if (code === 200 || code === 0) {
      // 请求成功
      return response.data
    } else if (code === 401) {
      // token 失效，清除用户信息并跳转到登录页
      const userStore = useUserStore()
      userStore.logout()
      
      toast.error('登录已过期，请重新登录')
      
      // 跳转到登录页
      if (window.location.pathname !== '/login') {
        window.location.href = '/login'
      }
      
      return Promise.reject(new Error(message || '登录已过期'))
    } else if (code === 403) {
      // 权限不足
      toast.error(message || '权限不足')
      return Promise.reject(new Error(message || '权限不足'))
    } else if (code === 404) {
      // 资源不存在
      toast.error(message || '请求的资源不存在')
      return Promise.reject(new Error(message || '请求的资源不存在'))
    } else if (code === 500) {
      // 服务器错误
      toast.error(message || '服务器内部错误')
      return Promise.reject(new Error(message || '服务器内部错误'))
    } else {
      // 其他错误
      toast.error(message || '请求失败')
      return Promise.reject(new Error(message || '请求失败'))
    }
  },
  error => {
    console.error('❌ Response Error:', error)

    let errorMessage = '网络错误'

    if (error.response) {
      // 服务器返回了错误状态码
      const { status, data } = error.response
      
      switch (status) {
        case 400:
          errorMessage = data?.message || '请求参数错误'
          break
        case 401:
          errorMessage = '未授权，请重新登录'
          // 清除用户信息
          const userStore = useUserStore()
          userStore.logout()
          // 跳转到登录页
          if (window.location.pathname !== '/login') {
            window.location.href = '/login'
          }
          break
        case 403:
          errorMessage = '拒绝访问'
          break
        case 404:
          errorMessage = '请求的资源不存在'
          break
        case 408:
          errorMessage = '请求超时'
          break
        case 500:
          errorMessage = '服务器内部错误'
          break
        case 502:
          errorMessage = '网关错误'
          break
        case 503:
          errorMessage = '服务不可用'
          break
        case 504:
          errorMessage = '网关超时'
          break
        default:
          errorMessage = data?.message || `请求失败 (${status})`
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应
      if (error.code === 'ECONNABORTED') {
        errorMessage = '请求超时，请稍后重试'
      } else if (error.code === 'ERR_NETWORK') {
        errorMessage = '网络连接失败，请检查网络'
      } else {
        errorMessage = '网络错误，请检查网络连接'
      }
    } else {
      // 其他错误
      errorMessage = error.message || '未知错误'
    }

    // 显示错误提示
    toast.error(errorMessage)

    return Promise.reject(error)
  }
)

// 封装常用请求方法
const request = {
  get(url, config) {
    return service.get(url, config)
  },
  
  post(url, data, config) {
    return service.post(url, data, config)
  },
  
  put(url, data, config) {
    return service.put(url, data, config)
  },
  
  delete(url, config) {
    return service.delete(url, config)
  },
  
  patch(url, data, config) {
    return service.patch(url, data, config)
  },
  
  // 上传文件的便捷方法
  upload(url, formData, onProgress) {
    return service.post(url, formData, {
      headers: {
        'Content-Type': 'multipart/form-data'
      },
      onUploadProgress: onProgress
    })
  },
  
  // 下载文件的便捷方法
  download(url, params, filename) {
    return service.get(url, {
      params,
      responseType: 'blob'
    }).then(response => {
      // 创建下载链接
      const blob = new Blob([response.data])
      const downloadUrl = window.URL.createObjectURL(blob)
      const link = document.createElement('a')
      link.href = downloadUrl
      link.download = filename || 'download'
      document.body.appendChild(link)
      link.click()
      document.body.removeChild(link)
      window.URL.revokeObjectURL(downloadUrl)
    })
  }
}

// 导出 axios 实例和封装的方法
export default service
export { request }




